// ProjectName: go-learn-demo
// PackageName: main
// Description:
// Author: hy.bai
// Date: 2025-07-31 14:53

package main

import (
	"fmt"
	"sync"
)

// 定义一个全局变量
var num int = 0

// 定义一个协程计数器
var wg sync.WaitGroup

// 定义一个互斥锁。等价于:JAVA中的ReentrantLock(可重入锁)
var lock sync.Mutex

func add() {
	defer wg.Done()
	// 使用互斥锁把不允许多个协程同时访问的代码锁起来
	lock.Lock()
	num += 1
	lock.Unlock()
}

func main() {
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go add()
	}
	wg.Wait()
	fmt.Printf("所有协程执行完毕,num的结果是:%d\n", num)
	// 正确答案应该是1000才对，但是每次还行的结果都不一样。
	// 要解决这个问题，保证执行"num +=1"代码时,只允许一个线程(这里表现为协程)运行
}
